﻿#ifndef __H_STREAMDECODEC_H__
#define __H_STREAMDECODEC_H__

#include <atomic>
#include <mutex>
#include <QObject>
#include <QVariant>


extern "C"
{
#include "libavformat/avformat.h"
#include "libavcodec/avcodec.h"
#include "libswscale/swscale.h"
#include "libavdevice/avdevice.h"
#include "libavformat/avio.h"
#include "libavutil/imgutils.h"
#include "libavutil/error.h"
#include "libswresample/swresample.h"
}

class StreamDecodec
    : public QObject
{
    Q_OBJECT
public:
    StreamDecodec(QObject* parent = nullptr);
    virtual ~StreamDecodec();

    void setUrl(QString val);

    void play(QString url = "");

    bool getExitRead() const;
    void setExitRead(bool val);
Q_SIGNALS:

    void sigStreamView(QVariant view);
    void sigStreamAudio(QVariant audio);

protected:
    void init();

    void threadReadThread(QString strUrl);

    void audioStreamDecodec(AVPacket* pAvPktView, AVFrame* pStreamFrame, uint8_t* bufferOut);

    void viewStreamDecodec(AVPacket* pAvPktView, AVFrame* pStreamFrame);

private:
    QString m_strUrl;

    // 视频流上下文
    AVFormatContext* m_pFmtCtx;

    // 音频编解码器
    AVCodec* m_pViewCodec;
    // 音频编解码器
    AVCodec* m_pAudioCodec;

    // 视频编码器上下文
    AVCodecContext* m_pViewCodecCtx;
    // 音频编码器上下文
    AVCodecContext* m_pAudioCodecCtx;

    // 视频流
    AVStream* m_pViewStream;
    // 视频流索引
    int m_nViewIdx;
    // 音频流
    AVStream* m_pAudioStream;
    // 音频流索引
    int m_nAudioIdx;

    // 图片转换上下文
    struct SwsContext* m_pImgConvertCtx;
    // 声音转换上下文
    struct SwrContext* m_pAudioConvertCtx;

    // 线程退出
    std::atomic<bool> m_bExitRead;

    // 解码线程锁
    //std::mutex m_mutex;


};


#endif // __H_STREAMDECODEC_H__
